home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Developer CD v2.1
/
Amiga Developer CD v2.1.iso
/
CDTV
/
cdtvtools-11
/
cdxl
/
xl.c
Wrap
C/C++ Source or Header
|
1991-06-24
|
5KB
|
161 lines
/*
***********************************************************************
***
*** CDTV CDXL Example #1 - Simple but Useful
***
*** Written by Carl Sassenrath, Jan 1991
***
*** In this simple example 12 megabytes of random CDROM data are
*** transferred into two "ping-pong" buffers. This is done by
*** creating a circular transfer list (tail connects back to head).
*** At the end of each transfer, a callback function is executed to
*** increment a counter.
***
*** Once you understand this example, it should take little time
*** to enhance it to deliver graphics, sound, text, etc. as your
*** application requires.
***
*** Read the CDXL developer notes for more information.
***
*** Compiled and Tested under SAS/C 5.10a (Lattice)
*** Compiler options: -b0 (32 bit addressing)
***
* Copyright (c) 1991 Commodore Business Machines, Inc.
* The source code examples included are used on the Welcome Disc. These
* examples are provided for information purposes only, on an "as is" basis.
* No warranties of any nature, express or implied, are made. Any use
* of these examples is at your own risk with no liability or responsability
* of any kind being assumed by Commodore, its suppliers and developers,
* or their employees.
*
* Subject to these limitations, executables based upon these examples
* may be developed and used in software for the Commodore CDTV. All
* other rights are reserved.
*
***********************************************************************/
#include <exec/types.h>
#include <exec/io.h>
#include "cdtv.h"
extern struct IOStdReq *CreateStdIO();
extern struct MsgPort *CreatePort();
#define FRAMES 1000
#define READLEN 6
#define BLKSIZE 2048
#define BUFSIZE (READLEN*BLKSIZE)
#define MUST(expr) if (!(expr)) Quit(AssertFail);
int Count = 0;
char Buf[BUFSIZE*2];
char AssertFail[] = "Assertion failed (MUST)";
struct IOStdReq *IOReq = NULL;
struct MsgPort *IOPort = NULL;
struct MinList XLList;
struct CDXL XLNodes[2];
/***********************************************************************
***
*** Quit -- exit program and clean-up. Return an error in needed.
***
***********************************************************************/
void Quit(s)
char *s; /* error message */
{
if (IOReq && IOReq->io_Device) CloseDevice(IOReq);
if (IOReq) DeleteStdIO(IOReq);
if (IOPort) DeletePort(IOPort);
if (s) {printf("\nERROR: %s\n",s); exit(40);}
else exit(0);
}
/***********************************************************************
***
*** Init -- initialize program and structures
***
***********************************************************************/
void Init()
{
MUST(IOPort = CreatePort(0,0));
MUST(IOReq = CreateStdIO(IOPort));
if (OpenDevice("cdtv.device",0,IOReq,0))
Quit("CDTV Device will not open");
}
/***********************************************************************
***
*** SendIOR -- asynchronously execute a device command
***
***********************************************************************/
void SendIOR(req,cmd,off,len,data)
struct IOStdReq *req;
int cmd;
long off;
long len;
APTR data;
{
req->io_Command = cmd;
req->io_Offset = off;
req->io_Length = len;
req->io_Data = data;
SendIO(req);
}
/***********************************************************************
***
*** XLCall -- XL Callback function (runs as an interrupt)
***
***********************************************************************/
void __interrupt XLCall()
{
Count++;
}
/***********************************************************************
***
*** Main
***
***********************************************************************/
main(argc,argv)
int argc;
char *argv[];
{
int i;
printf("XL Example\n");
Init();
/* Create the Transfer List: */
XLList.mlh_Head = (struct MinNode *)&XLList.mlh_Tail;
XLList.mlh_Tail = NULL;
XLList.mlh_TailPred = (struct MinNode *)&XLList.mlh_Head;
for (i = 0; i < 2; i++)
{
XLNodes[i].Buffer = &Buf[i*BUFSIZE];
XLNodes[i].Length = BUFSIZE;
XLNodes[i].DoneFunc = XLCall;
AddTail(&XLList,&XLNodes[i]);
}
/* Make it a circular list: */
XLList.mlh_Head->mln_Pred = XLList.mlh_TailPred;
XLList.mlh_TailPred->mln_Succ = XLList.mlh_Head;
/* Start the transfer: */
SendIOR(IOReq,CD_READXL,100,READLEN*FRAMES,XLList.mlh_Head);
printf("Transferring data...\r");
while (!CheckIO(IOReq)) printf("%8ld Bytes\n",Count*BUFSIZE);
WaitIO(IOReq);
Quit(0);
}